package com.atguigu.demojuc.chap05;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * 案例：组队打boss过关卡游戏。
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        /*
        parties = 3  表示三个相互等待线程
        runnable  三个相互等待的线程，最后一个线程到达屏障点，就执行runnable主任务
         */
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3, () -> { //用于统计分数,由最后一个玩家到达屏障后，调用执行。
            System.out.println(Thread.currentThread().getName() + "\t" + "---come in , 统计分数...");
        }
        );

        for (int i = 1; i <= 3; i++) {
            String num = String.valueOf(i);
            new Thread(()->{
                try {
                    System.out.println(Thread.currentThread().getName() + "\t" + "---开始第1关游戏");
                    TimeUnit.SECONDS.sleep(new Random().nextInt(10)); //模拟打游戏时间
                    System.out.println(Thread.currentThread().getName() + "\t" + "---完成第1关游戏");
                    cyclicBarrier.await();  //屏障点 最后到达屏障点的线程  会执行一次  主任务。

                    System.out.println(Thread.currentThread().getName() + "\t" + "---开始第2关游戏");
                    TimeUnit.SECONDS.sleep(new Random().nextInt(10)); //模拟打游戏时间
                    System.out.println(Thread.currentThread().getName() + "\t" + "---完成第2关游戏");
                    cyclicBarrier.await();  //屏障点

                    System.out.println(Thread.currentThread().getName() + "\t" + "---开始第3关游戏");
                    TimeUnit.SECONDS.sleep(new Random().nextInt(10)); //模拟打游戏时间
                    System.out.println(Thread.currentThread().getName() + "\t" + "---完成第3关游戏");
                    cyclicBarrier.await();  //屏障点
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }
            },"玩家-"+num).start();
        }

    }
}
